/*
 * Indexador.h
 *
 */

#ifndef INDEXADOR_H_
#define INDEXADOR_H_
#include "../preIndexador/parser/RegistroPalabra.h"
#include "../preIndexador/PreIndexador.h"
#include "../archivador/ArchivoRuta.h"
#include "IndiceInvertido.h"
#include "../preIndexador/parser/Parser.h"
#include "RegistroRelevanciaDeDocumento.h"
#include "../utiles/Utilidad.h"
#include <list>
#include <stack>
#include <math.h>



typedef list<RegistroPalabra> listaDeRegPalabras;
class Indexador {
private:
	ArchivoRuta* archivoRutaDeDocumentos;
	IndiceInvertido* indiceInvertido;

	//Asocia un termino con el id de un documento y con el peso del termino en el documento
	void agregarAIndiceInvertido(RegistroPalabra unRegistroPalabra, int unId);

	/**** lo puse publico pero en realidad es privado y se llama dentro del metodo: buscarConsulta ****/
    vector<RegistroRelevanciaDeDocumento>	obtenerRelevanciasDeDocumentosAsociadosConLaConsulta(list<string> &listaDeTerminosDeLaConsulta, int cantArchTot);

    void almacenar();
    list<string> salvarPaths();

public:

	Indexador();

	/************* este lo agregue solo para probar el test ******************/
	Indexador(IndiceInvertido *indi);

	//Asocia los terminos con sus respectivos documentos
	void indexar(list<listaDeRegPalabras>* listaDeTerminos, list<string>* listaDePaths);

	//hace nuevamente todo el proceso de indexacion, quedando indexado solamente el nuevo directorio
	void reindexar(string pathNuevoDir);

	//metodo que agrega mas directorios, y mantiene los que ya estaban
    void agragarDirectorio(string pathNuevoDir);

	//metodo agregado solo para chequeo por ahora
	RegistroIndice* buscar(string termino);

	//realiza la consulta y devuelve los documentos relevantes
	list<string> buscarConsulta(string consulta);


	virtual ~Indexador();
};

#endif /* INDEXADOR_H_ */
